<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>setTimeout之闭包</title>
</head>
<body>
<script type="text/javascript">
	/*1:setTimeout 采用队列结构:队列执行的时间，需要等待到函数调用栈清空之后才开始执行。即所有可执行代码执行完毕之后，才会开始执行由setTimeout定义的操作。而这些操作进入队列的顺序，则由设定的延迟时间来决定。*/
    for(var i=0;i<6;i++){
        setTimeout(function(){
            console.log(i)
        },i*1000)
    }
    //每隔1s输出一个6
    //解释:在for循环执行的过程中,设定1s后执行一个setTimeout函数推入队列中,2s后执行一个setTimeout函数推入队列中,以此类推.在for循环执行完毕后,i值已经为6,执行队列中的函数,在for循环消耗时间忽略不计的情况下,每隔一秒执行一个setTimeout函数
    /*闭包两个用处:1:读取函数内部的变量2:让这些变量始终保存在内存中*/
    /*
        解决办法
        1.闭包,通过一个立即执行的函数,为每次循环设置一个独立的作用域,闭包模仿块级作用域的用法
        2.使用es6中的let,设定每次运行设定一个块级作用域
        3.类似于方法2，使用setTimeout的第三个参数直接传参,不常用
    */
    for(var j=0;j<6;j++){
        (function(j){
            setTimeout(function(){
                console.log(j)
            },j*1000)
        })(j)
    }/* 1 */

    for(let k=0;k<6;k++){
        setTimeout(function(){
            console.log(k)
        },k*1000)
    }/*2*/
    for (var m = 0; m < 6; m++) {
      setTimeout(function(m) {
        console.log(m);
      }, m * 1000,m);
  }/* 3 */
</script>
</body>
</html>
